/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */



package itm.dao.personas;

//~--- non-JDK imports --------------------------------------------------------

import itm.exception.ControlException;

import itm.vo.administracion.InstitucionVO;
import itm.vo.administracion.OcupacionesVO;
import itm.vo.administracion.RolVo;
import itm.vo.administracion.TipoIdentificacionVO;
import itm.vo.administracion.facultadesVO;
import itm.vo.personas.GlobalPersonaTO;
import itm.vo.personas.PersonaOcupacionVO;
import itm.vo.personas.PersonaRolVO;
import itm.vo.personas.PersonaVO;

//~--- JDK imports ------------------------------------------------------------

import java.sql.CallableStatement;
import java.sql.Connection;

//import java.sql.ResultSet;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Fabio AndrÃ©s CÃ¡rdenas LondoÃ±o
 */
public class PersonaDAO {
    private CallableStatement callStmt = null;
    private ResultSet         res      = null;
    private String            sql      = "";
    RolVo                     rolVO    = new RolVo();

    // GlobalPersonaTO personaTO = new GlobalPersonaTO();
    PersonaVO            personaVO        = new PersonaVO();
    OcupacionesVO        ocupacionesVO    = new OcupacionesVO();
    InstitucionVO        institucionVO    = new InstitucionVO();
    TipoIdentificacionVO identificacionVO = new TipoIdentificacionVO();
    facultadesVO         facultadVO       = new facultadesVO();
    Connection           dbConexion;

    public PersonaDAO(Connection dbConexion) {
        this.dbConexion = dbConexion;
    }

    public String crearPersona(PersonaVO personaVO, PersonaOcupacionVO ocupacionVO)
            throws ControlException, SQLException {
        String errorM = "";

        try {
            sql      = "{call ITM_CREAR_PERSONA(?,?,?,?,?,?,?,?,?,?,?,?,?,?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.registerOutParameter(1, java.sql.Types.VARCHAR);
            callStmt.setString(2, personaVO.getIdTipoIdentificacion());
            callStmt.setString(3, personaVO.getIdPersona());
            callStmt.setString(4, personaVO.getNombrePersona());
            callStmt.setDate(5, personaVO.getFechaNacimiento());
            callStmt.setString(6, personaVO.getTelefono());
            callStmt.setString(7, personaVO.getEmail());
            callStmt.setString(8, personaVO.getIdInstitucion());
            callStmt.setDate(9, personaVO.getFechaIngreso());
            callStmt.setString(10, personaVO.getEstadoActual());
            callStmt.setString(11, personaVO.getUsuario());
            callStmt.setString(12, personaVO.getContraseña());
            callStmt.setString(13, personaVO.getIdFacultad());
            callStmt.setString(14, ocupacionVO.getIdOcupacion());
            //callStmt.setString(15, rolVO.getIdRol());
            callStmt.execute();
            errorM = callStmt.getString(1);
        } catch (SQLException ce) {
            ce.getStackTrace();
        }

        return errorM;
    }

    public String insertarRolPersona(PersonaRolVO perRol) throws ControlException, SQLException {
        String errorM = "";

        try {
            sql      = "{call ITM_CREAR_ROL_X_PERSONA(?,?,?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.registerOutParameter(1, java.sql.Types.VARCHAR);
            callStmt.setString(2, perRol.getIdPersona());
            callStmt.setString(3, perRol.getIdRol());
            callStmt.execute();
            errorM = callStmt.getString(1);
        } catch (SQLException ce) {
            ce.getStackTrace();
        }

        return errorM;
    }

    public List<TipoIdentificacionVO> llenarListaTipoId() throws ControlException, SQLException {
        List<TipoIdentificacionVO> listaTipo = new ArrayList<TipoIdentificacionVO>();
        TipoIdentificacionVO       tipoVO;

        try {
            sql      = "{call ITM_LLENAR_LISTA_TIPO_ID()}";
            callStmt = dbConexion.prepareCall(sql);
            res      = callStmt.executeQuery();

            while (res.next()) {
                tipoVO = new TipoIdentificacionVO();
                tipoVO.setIdTipoId(res.getString(1));
                tipoVO.setTipo(res.getString(2));
                listaTipo.add(tipoVO);
            }
        } catch (SQLException ce) {
            ce.getStackTrace();
        }

        return listaTipo;
    }

    public List<OcupacionesVO> llenarListaOcupacion() throws ControlException, SQLException {
        List<OcupacionesVO> listaOcupacion = new ArrayList<OcupacionesVO>();
        OcupacionesVO       ocupacionVO;

        try {
            sql      = "{call ITM_LLENAR_LISTA_OCUPACION()}";
            callStmt = dbConexion.prepareCall(sql);
            res      = callStmt.executeQuery();

            while (res.next()) {
                ocupacionVO = new OcupacionesVO();
                ocupacionVO.setIdOcupacion(res.getString(1));
                ocupacionVO.setNombreOcupacion(res.getString(2));
                listaOcupacion.add(ocupacionVO);
            }
        } catch (SQLException ce) {
            ce.getStackTrace();
        }

        return listaOcupacion;
    }

    public List<InstitucionVO> llenarListaInstitucion() throws ControlException, SQLException {
        List<InstitucionVO> listaInstitucion = new ArrayList<InstitucionVO>();
        InstitucionVO       institucionVO;

        try {
            sql      = "{call ITM_LLENAR_LISTA_INSTITUCIONES()}";
            callStmt = dbConexion.prepareCall(sql);
            res      = callStmt.executeQuery();

            while (res.next()) {
                institucionVO = new InstitucionVO();
                institucionVO.setIdInstitucion(res.getString(1));
                institucionVO.setNombreInstitucion(res.getString(2));
                listaInstitucion.add(institucionVO);
            }
        } catch (SQLException ce) {
            ce.getStackTrace();
        }

        return listaInstitucion;
    }

    public List<facultadesVO> llenarListaFacultades() throws ControlException, SQLException {
        List<facultadesVO> listaFacultad = new ArrayList<facultadesVO>();
        facultadesVO       facultadVO;

        try {
            sql      = "{call ITM_LLENAR_LISTA_FACULTAD()}";
            callStmt = dbConexion.prepareCall(sql);
            res      = callStmt.executeQuery();

            while (res.next()) {
                facultadVO = new facultadesVO();
                facultadVO.setIdFacultad(res.getString(1));
                facultadVO.setNombreFacultad(res.getString(2));
                listaFacultad.add(facultadVO);
            }
        } catch (SQLException ce) {
            ce.getStackTrace();
        }

        return listaFacultad;
    }

    public List<RolVo> llenarListaRoles() throws ControlException, SQLException {
        List<RolVo> listaRol = new ArrayList<RolVo>();
        RolVo       rolVO;

        try {
            sql      = "{call ITM_LLENAR_LISTA_ROL()}";
            callStmt = dbConexion.prepareCall(sql);
            res      = callStmt.executeQuery();

            while (res.next()) {
                rolVO = new RolVo();
                rolVO.setIdROl(res.getString(1));
                rolVO.setNombreRol(res.getString(2));
                listaRol.add(rolVO);
            }
        } catch (SQLException ce) {
            ce.getStackTrace();
        }

        return listaRol;
    }

    public List<RolVo> consultarRolesPersonaPk(String idPersona) throws ControlException, SQLException {
        List<RolVo> listaRol = new ArrayList<RolVo>();

        try {
            sql      = "{call ITM_LLENAR_LISTA_ROL_PERSONA(?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.setString(1, idPersona);
            res = callStmt.executeQuery();

            while (res.next()) {
                rolVO = new RolVo();
                rolVO.setIdROl(res.getString(1));
                rolVO.setNombreRol(res.getString(2));
                listaRol.add(rolVO);
            }
        } catch (SQLException ce) {
            ce.getStackTrace();
        }
        return listaRol;
    }

    public List<PersonaVO> consultarPersona(PersonaVO personaVO) throws ControlException, SQLException {
        List<PersonaVO> listaPersonas = new ArrayList<PersonaVO>();

        try {
            sql      = "{call ITM_CONSULTAR_PERSONAS(?,?,?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.setString(1, personaVO.getIdTipoIdentificacion());
            callStmt.setString(2, personaVO.getIdPersona());
            callStmt.setString(3, personaVO.getNombrePersona());
            res = callStmt.executeQuery();

            // if
            while (res.next()) {
                personaVO = new PersonaVO();
                personaVO.setIdPersona(res.getString(1));
                personaVO.setNombrePersona(res.getString(2));
                listaPersonas.add(personaVO);
            }
        } catch (SQLException ce) {
            ce.getStackTrace();
        }

        return listaPersonas;
    }

    public GlobalPersonaTO consultarPersonaPk(GlobalPersonaTO personaTO) throws ControlException, SQLException {
        try {
            sql      = "{call ITM_CONSULTAR_PERSONA(?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.setString(1, personaTO.getPersonaVO().getIdPersona());
            res = callStmt.executeQuery();

            if (res.next()) {
                identificacionVO.setTipo(res.getString(1));
                personaVO.setIdPersona(res.getString(2));
                personaVO.setNombrePersona(res.getString(3));
                personaVO.setFechaNacimiento(res.getDate(4));
                personaVO.setTelefono(res.getString(5));
                personaVO.setEmail(res.getString(6));
                ocupacionesVO.setNombreOcupacion(res.getString(7));
                institucionVO.setNombreInstitucion(res.getString(8));
                facultadVO.setNombreFacultad(res.getString(9));
                //rolVO.setNombreRol(res.getString(10));
                personaVO.setFechaIngreso(res.getDate(10));
                personaVO.setEstadoActual(res.getString(11));
                personaVO.setUsuario(res.getString(12));
                personaTO.setIdentificacionVO(identificacionVO);
                personaTO.setPersonaVO(personaVO);
                personaTO.setOcupacionVO(ocupacionesVO);
                personaTO.setInstitucionVO(institucionVO);
                personaTO.setFacultadVO(facultadVO);
                personaTO.setRolVO(rolVO);
            }
        } catch (SQLException ce) {
            ce.getStackTrace();
        }

        return personaTO;
    }

    public String actualizarPersona(PersonaVO personaVO, PersonaOcupacionVO ocupacionVO)
            throws ControlException, SQLException {
        String errorM = "";

        try {
            sql      = "{call ITM_ACTUALIZAR_PERSONA(?,?,?,?,?,?,?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.registerOutParameter(1, java.sql.Types.VARCHAR);
            callStmt.setString(2, personaVO.getIdPersona());
            callStmt.setString(3, personaVO.getTelefono());
            callStmt.setString(4, personaVO.getEmail());
            callStmt.setString(5, personaVO.getIdInstitucion());
            callStmt.setString(6, personaVO.getEstadoActual());
            callStmt.setString(7, ocupacionVO.getIdOcupacion());
            callStmt.execute();
            errorM = callStmt.getString(1);
        } catch (SQLException ce) {
            ce.getStackTrace();
        }

        return errorM;
    }

    public String eliminarPersona(PersonaVO personaVO) throws ControlException, SQLException {
        String errorM = "";

        try {
            sql      = "{call ITM_ELIMINAR_PERSONA(?, ?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.registerOutParameter(1, java.sql.Types.VARCHAR);
            callStmt.setString(2, personaVO.getIdPersona());
            callStmt.execute();
            errorM = callStmt.getString(1);
        } catch (SQLException ce) {
            ce.getStackTrace();
        }

        return errorM;
    }
}
